#include "tabwin1.h"

// 函数定义
cv::Vec3f TabWin1::rgbToHSV(const cv::Vec3b& rgbColor) {
    // 将RGB颜色值转换为BGR格式，因为OpenCV使用BGR
    cv::Scalar bgrScalar(rgbColor[2], rgbColor[1], rgbColor[0]);

    // 创建一个Mat对象，用于cvtColor函数
    cv::Mat src(1, 1, CV_8UC3, (void*)&bgrScalar);

    // 创建一个Mat对象，用于存储转换后的HSV值
    cv::Mat hsv;

    // 使用cvtColor函数将BGR转换为HSV
    cv::cvtColor(src, hsv, cv::COLOR_BGR2HSV);

    // 将转换后的HSV值转换为Vec3f
    cv::Vec3f hsvValue;
    hsv.reshape(1, 1).convertTo(hsvValue, CV_32F);

    return hsvValue;
}

QImage TabWin1::cvMat2QImage(const cv::Mat &mat)
{
    QImage image;
    switch(mat.type())
    {
    case CV_8UC1:
        // QImage构造：数据，宽度，高度，每行多少字节，存储结构
        image = QImage((const unsigned char*)mat.data, mat.cols, mat.rows, mat.step, QImage::Format_Grayscale8);
        break;
    case CV_8UC3:
        //image = QImage((const unsigned char*)mat.data, mat.cols, mat.rows, mat.step, QImage::Format_RGB888);
        //image = image.rgbSwapped(); // BRG转为RGB
        // Qt5.14增加了Format_BGR888
        image = QImage((const unsigned char*)mat.data, mat.cols, mat.rows, mat.cols * 3, QImage::Format_BGR888);
        break;
    case CV_8UC4:
        image = QImage((const unsigned char*)mat.data, mat.cols, mat.rows, mat.step, QImage::Format_ARGB32);
        break;
    case CV_16UC4:
        image = QImage((const unsigned char*)mat.data, mat.cols, mat.rows, mat.step, QImage::Format_RGBA64);
        image = image.rgbSwapped(); // BRG转为RGB
        break;
    }
    return image;
}

cv::Mat TabWin1::QImage2cvMat(const QImage &image)
{
    cv::Mat mat;
    switch(image.format())
    {
    case QImage::Format_Grayscale8: // 灰度图，每个像素点1个字节（8位）
        // Mat构造：行数，列数，存储结构，数据，step每行多少字节
        mat = cv::Mat(image.height(), image.width(), CV_8UC1, (void*)image.constBits(), image.bytesPerLine());
        break;
    case QImage::Format_ARGB32: // uint32存储0xAARRGGBB，pc一般小端存储低位在前，所以字节顺序就成了BGRA
    case QImage::Format_RGB32: // Alpha为FF
    case QImage::Format_ARGB32_Premultiplied:
        mat = cv::Mat(image.height(), image.width(), CV_8UC4, (void*)image.constBits(), image.bytesPerLine());
        break;
    case QImage::Format_RGB888: // RR,GG,BB字节顺序存储
        mat = cv::Mat(image.height(), image.width(), CV_8UC3, (void*)image.constBits(), image.bytesPerLine());
        // opencv需要转为BGR的字节顺序
        cv::cvtColor(mat, mat, cv::COLOR_RGB2BGR);
        break;
    case QImage::Format_RGBA64: // uint64存储，顺序和Format_ARGB32相反，RGBA
        mat = cv::Mat(image.height(), image.width(), CV_16UC4, (void*)image.constBits(), image.bytesPerLine());
        // opencv需要转为BGRA的字节顺序
        cv::cvtColor(mat, mat, cv::COLOR_RGBA2BGRA);
        break;
    }
    cv::Mat mat2;
    mat.copyTo(mat2);
    return mat2;
}
